package net.maku.project.convert;

import net.maku.project.entity.ProcessStatesEntity;
import net.maku.project.vo.ProcessStatesVO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;

/**
 * 流程状态表
 *
 * @author 艾力 1106997025@qq.com
 * @since 1.0.0 2024-07-09
 */
@Mapper //(uses = ProcessStatesConvertImpl.class)
public interface ProcessStatesConvert {
    ProcessStatesConvert INSTANCE = Mappers.getMapper(ProcessStatesConvert.class);

    ProcessStatesEntity convert(ProcessStatesVO vo);


    default ProcessStatesVO convert(ProcessStatesEntity entity) {
        if (Objects.isNull(entity)) {
            return null;
        }
        ProcessStatesVO vo = new ProcessStatesVO();
        vo.setId(entity.getId());
        vo.setProjectId(entity.getProjectId());
        vo.setStageId(entity.getStageId());
        vo.setStepId(entity.getStepId());
        vo.setOperatorId(entity.getOperatorId());
        vo.setStatus(entity.getStatus());
        vo.setMatlConfirm(entity.getMatlConfirm());
        vo.setCompleted(entity.getCompleted());
        vo.setStartTime(entity.getStartTime());
        vo.setCompletionTime(entity.getCompletionTime());
        vo.setDuration(ProcessStatesConvert.calculateDuration(entity.getStartTime(),entity.getCompletionTime()));
        vo.setTimerStarted(entity.getTimerStarted());
        vo.setBranchPath(entity.getBranchPath());
        vo.setRemark(entity.getRemark());
        return vo;
    }

    List<ProcessStatesVO> convertList(List<ProcessStatesEntity> list);


//    ProcessStatesConvert instance = new ProcessStatesConvert11Impl();
    /**
     * 将实体列表转换为VO列表，并计算每个VO的duration字段。
     *
     * @param entities 实体列表
     * @return VO列表
     */
/*    default List<ProcessStatesVO> convertWithDuration(List<ProcessStatesEntity> entities) {
        List<ProcessStatesVO> vos = new ArrayList<>();
        for (ProcessStatesEntity entity : entities) {
            ProcessStatesVO vo = instance.convert(entity); // 假设convert是单个实体到VO的转换方法
            vo.setDuration(calculateDuration(entity.getStartTime(), entity.getCompletionTime()));
            vos.add(vo);
        }
        return vos;
    }*/

    /**
     * 根据开始时间和结束时间计算持续时间。
     * 结束时间为空时使用当前时间，开始和结束时间都为空时返回"--"。
     *
     * @param startTime      开始时间
     * @param completionTime 完成时间
     * @return 持续时间字符串
     */
    static String calculateDuration(LocalDateTime startTime, LocalDateTime completionTime) {
        if (startTime == null && completionTime == null) {
            return "--";
        } else if (startTime != null && completionTime == null) {
            completionTime = LocalDateTime.now(); // 使用当前时间作为结束时间
        } else if (startTime == null) {
            startTime = completionTime; // 虽然不合理，但逻辑上需要处理这种情况
        }

        Duration duration = Duration.between(startTime, completionTime);
        long days = duration.toDays();
        long hours = duration.toHours() % 24;
        long minutes = duration.toMinutes() % 60;

        return String.format("%s天%s时%s分", days, hours, minutes);
    }
}